package com.zhihuishu.micro.course.openapi.online;

import java.util.List;
import java.util.Map;

import com.zhihuishu.micro.course.openapi.online.dto.ChapterWebDto;
import com.zhihuishu.micro.course.openapi.online.dto.CourseClipsOpenDto;
import com.zhihuishu.micro.course.openapi.online.dto.CourseExtendPropEumn;
import com.zhihuishu.micro.course.openapi.online.dto.CourseOpenDto;
import com.zhihuishu.micro.course.openapi.online.dto.CoursePopularizeInfoOpenDto;
import com.zhihuishu.remote.RemoteException;
import com.zhihuishu.remote.RemoteResult;

/**
 * 课程远程接口
 * 
 * @author zhanglikun
 * @date 2015年10月14日 下午5:29:45
 */
public interface CourseOpenService {

    // =================================== 课程片花接口 ====================================

    /**
     * 查询片花
     * 
     * @param clipsId
     * @return
     * @throws RemoteException
     */
    RemoteResult<CourseClipsOpenDto> queryCourseClips(long clipsId) throws RemoteException;

    /**
     * 更新片花
     * 
     * @param clips
     * @return
     * @throws RemoteException
     */
    RemoteResult<Void> updateCourseClips(CourseClipsOpenDto clips) throws RemoteException;

    /**
     * 保存片花(需指定课程ID)
     * 
     * @param courseId
     * @param clips
     * @return 返回片花ID
     * @throws RemoteException
     */
    RemoteResult<Long> createCourseClips(long courseId, CourseClipsOpenDto clips) throws RemoteException;

    // =================================== 课程接口 ====================================

    /**
     * 创建课程，注意返回课程对象中只有courseId、linkCourseId两个字段有值 失败状态码errorCode = 1表示创建课程后返回课程ID为空(执行失败)
     * 
     * @param courseName 课程名称，非空
     * @param createUser 创建人，非空
     * @return
     * @throws RemoteException
     */
    RemoteResult<CourseOpenDto> create(String courseName, long createUser) throws RemoteException;

    /**
     * 更新课程
     * 
     * @param course
     * @return
     * @throws RemoteException
     */
    RemoteResult<Void> update(CourseOpenDto course, long updateUser) throws RemoteException;

    /**
     * 查询课程背景
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<String> queryCourseBackground(long courseId) throws RemoteException;

    /**
     * 查询课程目标
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<String> queryCourseTarget(long courseId) throws RemoteException;

    /**
     * 查询课程简介
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<String> queryCourseIntroduction(long courseId) throws RemoteException;

    /**
     * 查询课程封面图片
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<String> queryCourseImage(long courseId) throws RemoteException;

    /**
     * 查询课程推广信息
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<CoursePopularizeInfoOpenDto> queryCoursePopularize(long courseId) throws RemoteException;

    /**
     * 查询课程基本信息
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<CourseOpenDto> queryCourseInfo(long courseId) throws RemoteException;

    /**
     * 根据课程ID，查询课程下章总数
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Integer> countChapter(long courseId) throws RemoteException;

    /**
     * 统计课程下章节视频数
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Integer> countVideo(long courseId) throws RemoteException;

    /**
     * 根据课程ID得到课程需要的天数
     * 
     * @author ztl
     * @date 2016年4月18日13:57:36
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Integer> queryCourseLimitDay(long courseId) throws RemoteException;

    /**
     * 根据课程ID，查询共享课程信息:招生对象、学术准备内容
     * 
     * @author ztl
     * @date 2016年4月21日14:26:44
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Map<String, String>> queryRecruitObjAndAcademicPlan(long courseId) throws RemoteException;

    /**
     * 保存或更新共享课程信息:招生对象、学术准备内容
     * 
     * @author ztl
     * @date 2016年4月21日14:28:58
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Void> saveOrUpdateRecruitObjAndAcademicPlan(long courseId, String recruitObj,
            String academicPlan) throws RemoteException;

    // ================================================= 更新缓存接口
    // =======================================================

    /**
     * 更新课程缓存(Redis)，当前接口类中包含更新课程方法，已默认执行过此操作，请勿重复执行
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Void> updateCourseRedis(long courseId) throws RemoteException;

    /**
     * 初始化课程缓存(主要针对复制课程)
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<Void> initCourseRedis(long courseId) throws RemoteException;

    /**
     * 根据课程id查询课程进度信息
     * 
     * @author yulijin
     * @date 2016年8月16日 下午2:40:32
     * @param courseIds
     * @return key(Long):courseId
     *         key(String):progress：完整度百分比，mold（课程模式）:1老版建课、2新版本建课、3私有云建课、4海外建课、10微课程，
     *         filledTotalCount:必填项总数，unFilledCount：未填数
     * @throws RemoteException
     */
    RemoteResult<Map<Long, Map<String, Integer>>> findProgressByCourseIds(List<Long> courseIds)
            throws RemoteException;

    /**
     * 根据课程ids清除课程进度信息redis缓存
     * 
     * @author yulijin
     * @date 2016年8月18日 下午2:00:07
     * @param courseIds
     * @return
     * @throws RemoteException
     */
    RemoteResult<Void> delProgressByCourseIds(List<Long> courseIds) throws RemoteException;

    /**
     * 根据课程id查询其所对应的所有的复制课程ids（含本身）
     * 
     * @author yulijin
     * @date 2016年8月30日 下午3:42:30
     * @param courseIds
     * @return key:课程id,value:ids
     * @throws RemoteException
     */
    RemoteResult<Map<Long, List<Long>>> findCourseIdFamilysByCourseIds(List<Long> courseIds)
            throws RemoteException;

    /**
     * 根据指定课程下章节列表
     * 
     * @param courseId
     * @return
     * @throws RemoteException
     */
    RemoteResult<List<ChapterWebDto>> queryChapterInfos(long courseId) throws RemoteException;

    /**
     * 根据课程id与扩展表的属性名获取相应的属性
     * 
     * @discription
     * @author jipeng
     * @created 2016年9月29日 上午10:49:16
     * @param courseId
     * @param courseExtendPropEumns
     * @return
     */
    RemoteResult<Map<String, String>> queryCourseExtentPropByPropName(long courseId,
            CourseExtendPropEumn... courseExtendPropEumns);

    /**
     * 
     * @discription 根据课程id清除课程的redis缓存
     * @author jipeng
     * @created 2016年10月27日 上午9:44:46
     * @param courseId
     * @return
     */
    RemoteResult<Void> removeCourseChcheByCourseId(Long courseId);

    /**
     * 根据课程id集合查询课程的信息
     * 
     * @Title:
     * @Description: TODO
     * @param @param courseIds
     * @param @return
     * @return RemoteResult<List<CourseOpenDto>>
     * @author jipeng
     * @throws
     */
    // RemoteResult<List<CourseOpenDto>> queryCourseInfoByCourseIds(List<Long> courseIds);
    // 暂时没有用到，先注释掉

    /**
     * 
     * 
     * @Description: 删除课程
     * @param @param courseId
     * @param @param userId
     * @param @return
     * @return RemoteResult<Void>
     * @author jipeng
     * @throws
     */
    RemoteResult<Void> deleteCourse(Long courseId, long userId);

    /**
     * 快速删除课程
     * 
     * @Title:
     * @Description: TODO
     * @param @param courseId
     * @param @param userId
     * @param @return
     * @return RemoteResult<Void>
     * @author jipeng
     * @throws
     */
    RemoteResult<Void> deleteCourseInFastWay(Long courseId, long userId);
   
}
